kexec: switch to a known good/static GDT before kexec
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 2 Jul 2009 15:16:15 +0000 (16:16 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 2 Jul 2009 15:16:15 +0000 (16:16 +0100)
kexec has been failing (at least on 32on64, didn't try others) since
18771:8e18dd41c6c7 "x86: reduce GDT switching". Ensure that we are
using a known good GDT before attempting to switch to compatability
mode.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
xen/arch/x86/machine_kexec.c

index 748883459342f242104f1fb3f5ef8748ee1df0d6..f44aba2b5b6d8d7707db55c0faa197b8716307ef 100644 (file)
@@ -113,6 +113,18 @@ void machine_reboot_kexec(xen_kexec_image_t *image)
 
 void machine_kexec(xen_kexec_image_t *image)
 {
+    struct desc_ptr gdt_desc = {
+        .base = (unsigned long)(boot_cpu_gdt_table - FIRST_RESERVED_GDT_ENTRY),
+        .limit = LAST_RESERVED_GDT_BYTE
+    };
+
+    /*
+     * compat_machine_kexec() returns to idle pagetables, which requires us
+     * to be running on a static GDT mapping (idle pagetables have no GDT
+     * mappings in their per-domain mapping area).
+     */
+    asm volatile ( "lgdt %0" : : "m" (gdt_desc) );
+
 #ifdef CONFIG_COMPAT
     if ( is_pv_32on64_domain(dom0) )
     {